#pragma once

#include <iostream>
#include <unistd.h>
#include <memory>
#include <cstring>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
#include <functional>
#include <set>
#include <jsoncpp/json/json.h>

#include "InetAddr.hpp"
#include "Log.hpp"

// 代码退出等级
enum ExitCode
{
    OK = 0,        // 正常退出
    USAGE_ERR = 1, // 命令行输入格式错误
    SOCKET_ERR,    // socket 创建错误
    BIND_ERR,      // 绑定错误
    LISTEN_ERR,    // 监听错误
    CONNECT_ERR,   // 连接错误
    FORK_ERR,      // fork 错误
    OPEN_ERR,      // open文件错误
};

// 防止复制类
class NonCopy
{
public:
    NonCopy() = default;                          // 默认构造函数
    NonCopy(const NonCopy &) = delete;            // 禁止拷贝构造
    NonCopy &operator=(const NonCopy &) = delete; // 禁止赋值操作
    ~NonCopy() = default;                         // 默认析构函数
};

#define CONV(addr) ((struct sockaddr *)&addr) // 各socketaddr结构体类型 -> sockaddr *类型地址
